package jp.syuriken.snsw.terenaibot.mal.twitter;

import java.net.URL;
import java.util.Date;

import jp.syuriken.snsw.terenaibot.UserInfo;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.User;

/**
 * Twitter用のユーザー情報格納クラス。
 * 
 * @author $Author: snswinhaiku.lo@gmail.com $
 * @see TwitterDelayedUserInfo
 */
public class TwitterUserInfo implements UserInfo {
	
	private static final int HASH_CODE_BIT = 32;
	
	protected Date createdAt = null;
	
	protected String description = null;
	
	protected int followersCount = -1;
	
	protected int friendsCount = -1;
	
	protected String location = null;
	
	protected String name = null;
	
	protected int utcOffset = 0;
	
	protected long userId;
	
	protected URL url = null;
	
	protected String timeZone = null;
	
	protected String screenName = null;
	
	protected boolean gotInformation = true;
	

	/**
	 * インスタンスを生成する。
	 * 
	 */
	protected TwitterUserInfo() {
	}
	
	/**
	 * インスタンスを生成する。
	 * @param userId ユーザーID
	 * @param twitter Twitterインスタンス
	 * @throws TwitterException ユーザー情報の取得中にエラー。
	 */
	public TwitterUserInfo(long userId, Twitter twitter) throws TwitterException {
		this(twitter.showUser(userId));
	}
	
	/**
	 * インスタンスを生成する。
	 * 
	 * @param user ユーザー情報格納クラス。
	 */
	public TwitterUserInfo(User user) {
		setInfo(user);
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof TwitterUserInfo)) {
			return false;
		}
		TwitterUserInfo other = (TwitterUserInfo) obj;
		if (userId != other.userId) {
			return false;
		}
		return true;
	}
	
	@Override
	public Date getCreatedAt() {
		return (Date) createdAt.clone();
	}
	
	@Override
	public String getDescription() {
		return description;
	}
	
	@Override
	public int getFollowersCount() {
		return followersCount;
	}
	
	@Override
	public int getFriendsCount() {
		return friendsCount;
	}
	
	@Override
	public String getLocation() {
		
		return location;
	}
	
	@Override
	public String getName() {
		
		return name;
	}
	
	@Override
	public String getScreenName() {
		
		return screenName;
	}
	
	@Override
	public String getTimeZone() {
		
		return timeZone;
	}
	
	@Override
	public URL getURL() {
		
		return url;
	}
	
	@Override
	public String getUserId() {
		return String.valueOf(userId);
	}
	
	@Override
	public int getUtcOffset() {
		
		return utcOffset;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (int) (userId ^ (userId >>> HASH_CODE_BIT));
		return result;
	}
	
	/**
	 * アカウント作成日時の設定
	 * 
	 * @param createdAt the createdAt to set
	 */
	public void setCreatedAt(Date createdAt) {
		this.createdAt = (Date) createdAt.clone();
	}
	
	/**
	 * アカウントプロフィールの設定
	 * 
	 * @param description the description to set
	 */
	public void setDescription(String description) {
		this.description = description;
	}
	
	/**
	 * フォロワー数の設定
	 * @param followersCount the followersCount to set
	 */
	public void setFollowersCount(int followersCount) {
		this.followersCount = followersCount;
	}
	
	/**
	 *フォロー数の設定
	 * 
	 * @param friendsCount the friendsCount to set
	 */
	public void setFriendsCount(int friendsCount) {
		this.friendsCount = friendsCount;
	}
	
	/**
	 * ユーザー情報を設定する。
	 * 
	 * @param user ユーザー情報
	 */
	protected void setInfo(User user) {
		userId = user.getId();
		createdAt = user.getCreatedAt();
		description = user.getDescription();
		followersCount = user.getFollowersCount();
		friendsCount = user.getFriendsCount();
		location = user.getLocation();
		name = user.getName();
		utcOffset = user.getUtcOffset();
		url = user.getURL();
		timeZone = user.getTimeZone();
		screenName = user.getScreenName();
		gotInformation = true;
	}
	
	/**
	 * 場所の設定
	 * 
	 * @param location the location to set
	 */
	public void setLocation(String location) {
		this.location = location;
	}
	
	/**
	 * 名前の設定
	 * 
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * スクリーン名の設定
	 * 
	 * @param screenName the screenName to set
	 */
	public void setScreenName(String screenName) {
		this.screenName = screenName;
	}
	
	/**
	 * タイムゾーン名の設定
	 * 
	 * @param timeZone the timeZone to set
	 */
	public void setTimeZone(String timeZone) {
		this.timeZone = timeZone;
	}
	
	/**
	 * URLの設定
	 * 
	 * @param url the url to set
	 */
	public void setURL(URL url) {
		this.url = url;
	}
	
	/**
	 * UTCオフセットの設定
	 * 
	 * @param utcOffset the utcOffset to set
	 */
	public void setUtcOffset(int utcOffset) {
		this.utcOffset = utcOffset;
	}
	
	@Override
	public String toString() {
		return String.format("%s: %s f/f=%d/%d", getScreenName(), getUserId(), getFriendsCount(), getFollowersCount());
	}
	
}
